\documentclass[a4paper,10pt,onecolumn]{article}

\newcommand{\linux}{\mbox{\sc LINUX}}
\newcommand{\awk}{\mbox{\sc awk}}
\newcommand{\sort}{\mbox{\sc sort}}

\newcommand {\articleTitle}{Redes Neuronales}

% misc
\newcommand {\murl}[2]{\href{#1}{#2}}

% marcas / nombres de cosas usadas 
\usepackage[spanish]{babel}
\usepackage{graphicx}
\usepackage{graphics}
\usepackage[latin1]{inputenc}
\usepackage[pdftitle=\articleTitle
	    pdfauthor={},
	    pdfsubject={},
	    pdfkeywords={} 
	   ]{hyperref}

\usepackage{verbatim}
\usepackage{rotating}
% inclusion de codigo fuentes
\usepackage{listings}
\lstloadlanguages{c}


\author
{
	Juan F. Codagnone, \\
        Damian Modernell, \\
	Xin Wei Gou, 
}

\date{Junio 2010}


\title{\articleTitle\footnote{
  Copyright \copyright~ 2010 Juan F. Codagnone, Damian Modernell, Xin Wei Gou
  Este material puede ser
  distribuido solo sujeto a los t\'erminos y condiciones explicitados en la
  {\rm
  \murl{http://creativecommons.org/licenses/by-nc-nd/2.5/ar/deed.es_AR}{Creative
  Commons Atribuci\'on-NoComercial-SinDerivadas 2.5 Argentina}}. Ver
  \murl{http://creativecommons.org/licenses/by-nc-nd/2.5/ar/deed.es_AR}{http://creativecommons.org/licenses/by-nc-nd/2.5/ar/deed.es\_AR}.
  } %footnote
}%title
\oddsidemargin=0.3cm 
\textwidth=16cm
\begin{document}
\bibliographystyle{acm}
\maketitle

\tableofcontents

\section{Introducci\'on}

En el presente trabajo, vamos a realizar la implementaci\'on de una red neuronal multicapa, 
que nos permita resolver un problema en particular.
El objetivo del mismo es obtener una red neuronal, que luego de ser entrenada con una cantidad finita 
de valores, que representan nuestro problema en particular, sea capaz de resolver dicho problema con cierta
eficacia, para cualquier set de valores que representen al mismo. Luego vamos a analizar y comparar la eficiencia en el 
aprendizaje y la generalizaci\'on, variando algunos par\'ametros de la red neuronal, y con los resultados obtenidos, 
obtendremos nuestras conclusiones acerca de que par\'ametros de la red son los m\'as adecuados para resolver mejor
nuestro problema.

\section{El problema}
El problema que vamos a resolver con nuestra red, consiste en el an\'alisis de se\~nales obtenidas a
partir de muestras de electrocardiogramas. El objetivo deseado es que la red aprenda aquellas pulsaciones (se\~nales )
que esten formadas por una secuencia de tres o m\'as bits. Es decir, que dada una cadena de pulsaciones ( medidas en milivolts ), 
si tres o m\'as pulsaciones consecutivas dan como salida bits en 1, entonces nuestra red debe dar como salida un bit en 1.

\section{Implementaci\'on de la red neuronal}

La red neuronal la implementamos en GNU Octave, la misma consta de una capa de entrada, una capa oculta y una \'unica salida.
La capa de entrada es la que recibe los valores de entrada ( milivolts de las pulsaciones ) y debe recibir por lo menos 3 valores
para que la red determine si debe dar una salida en 1 o en 0. La cantidad de entradas de la red es uno de los par\'ametros de la red
que vamos a variar para analizar el aprendizaje. \\
La capa oculta de la red esta formada por una cantidad variable de neuronas, que tambien son un par\'ametro de la red y que analizaremos
en la secci\'on de resultados. En dicha capa, la red realiza la primera etapa de procesamiento, y dada una funci\'on de activaci\'on, env\'ia 
los valores procesados a la \'ultima capa que es la capa de salida.\\
La capa de salida obtiene los valores enviados por la capa oculta, y dada una segunda funci\'on de activaci\'on, devuelve la salida de la red.\\
La red neuronal en si, esta representada por dos matrices, una para conectar la capa de entrada con la capa oculta, y otra para conectar la 
capa oculta con la de salida. los valores de dichas matrices representan los pesos de interconexi\'on de las neuronas de la red. La primera
matriz esta formada por tantas filas como neuronas haya en la capa oculta, y tantas columnas como entradas tenga la red, y los pesos de la misma
interconectan las emtradas con la capa oculta. La segunda matriz interconecta la capa oculta con la salida, y es una matriz de 1 fila ( por ser una
\'unica salida ) y tantas columnas como neuronas tenga la capa oculta. A ambas matrices debemos asignarles una columna extra que representa el
umbral de activaci\'on de la neurona, pero no es una neurona m\'as en la red.

\subsection{Preprocesamiento}
Implementamos la red neuronal con la posibilidad de variar la funci\'on de transferencia, o funci\'on de activaci\'on de la red. \\
En nuestro caso, vamos a utilizar las siguientes funciones de transferencia.
\begin{equation}
 g(h)=tanh(\beta h )
\end{equation}
\begin{equation}
g(h)=1/(1+e{-2\beta h}
\end{equation}
Al implementar la red con la funci\'on de transferencia de la ecuaci\'on 1, debemos normalizar los valores de entrada de la red  ( milivolts )para
adaptarlos a nuestras funciones de transferencia.
de forma tal que queden comprendidos en el intervalo $ [ -1, 1] $ para la funci\'on de la ecuaci\'on 1 y debemos hacer lo mismo con la funci\'on de la
ecuaci\'on 2, pero comprendidos en el intervalo $ [0, 1] $. Para lograr esta normalizaci\'on, lo que hicimos fue transformar 
linealmente los valores de entrada, y mapearlos a los intervalos recien mensionados.

\subsection{Postprocesamiento}
Para obtener una red neuronal que nos sea util, debemos analizar los valores de salida de la misma, y tomar una determinaci\'on sobre si
fueron buenos o no, es decir, dado un valor de salida, debemos tomar una decision sobre si es un valor deseado, o si es erroneo. \\
Lo que hicimos fue definir una tolerancia $ tole $ tal que si la diferencia entre el valor de salida y el valor de salida deseado, es menor
a $ tole $, entonces tomamos el valor de salida como bueno.

\subsection{Aprendizaje}
El aprendizaje de nuestra red es supervisado, ya que contamos con las salidas deseadas para cada patron de entrada, entonces podemos
comparar las salidas de la red, con las salidas deseadas y calcular el error.\\
Como explicamos previamente, debemos entrenar la red para que aprenda a resolver un problema especifico. Para entrenar nuestra red, 
tomamos la mitad de las se\~nales de la muestra. La otra mitad la usaremos para analizar la generalizaci\'on de la red.\\
Para el entrenamiento utilizamos el algor\'itmo de backpropagation, con el m\'etodo de gradiente descendente. Tomamos el error
cuadr\'atico medio de la salida de cada patron, y propagamos dicho error a los pesos de las matrices de la red, multiplicados por una 
tasa de aprendizaje $ \eta $. De esta forma, los pesos de la red van variando cada uno en funci\'on de la derivada del error con respecto a 
dicho peso. \\
Al finalizar una \'epoca, se mezclan los patrones de le \'epoca anterior, y se vuelve a entrenar la red. La diversidad en el orden de los 
patrones para cada \'epoca, evita que la red quede estancada en minimos locales,donde dos o m\'as errores se compensan.\\
Nuestra red deja de entrenarse una vez que aprende todos los patrones que tienen como salida el bit en 1.

\subsection{Mejoras al algor\'itmo de aprendizaje} 
Dado que la tasa de aprendizaje \emph{learning rate} esta dada por la variable $\eta$, valores muy peque\~nos de $\eta$ pueden hacer que el algor\'itmo de aprendizaje
sea muy lento, y valores muy grandes, pueden hacer que el el aprendizaje oscile, ya que la correcci\'on del error pasa a ser muy grande. \\
Para mejorar el algor\'itmo de aprendizaje, implementamos a la variable $\eta$ variable de \'epoca en \'epoca, incrementandola en una constante $a$ 
cuando varias epocas consecutivas logran reducir el error, entonces $\eta$ es corregido para lograr un aprendizaje m\'as rapidamente. Y una reducci\'on
de $ \eta $ en forma proporcional a $\eta$ multiplicada por una constante $b$ para achicar la tasa de aprendizaje, y reducir el tama\~no del error.\\
A su vez, cada vez que una e\'epoca obtiene un error mayor a la \'epoca anterior, restamos las matrices de la red a su estado en la \'epoca anterior.
Otra de las mejoras que hicimos fue implementar el c\'alculo del \emph{Momentun}, del cual complementa la mejora del $\eta$ antes mencionada, 
acelerando el proceso de la convergencia durante el entrenamiento.
\subsection{Generalizaci\'on}
Una vez entrenada la red, debemos analizar la capacidad de generalizaci\'on, esto es, evaluar la red con una serie de patrones nuevos, que
no fueron utilizados en la etapa de entrenamiento, y observar los resultados obtenidos. Si la red aprendi\'o demasiado bien (memoriz\'o) los patrones de 
entrenamiento, entonces no sera buena generalizando, devolviendo salidas no deseadas en la etapa de generalizaci\'on. Lo mismo ocurre si 
no aprendi\'o o aprendi\'o poco.
\section{Resultados}
Una vez implementada la red, hicimos una serie de pruebas variando los par\'ametros de la red, para analizar el aprendizaje y  la generalizaci\'on,
y encontrar la configuraci\'on \'optima de dichos par\'ametros para nuestro problema en particular.
Las pruebas que realizamos se dividen de la siguiente manera. 
La primera secci\'on incluye las pruebas realizadas a la red tanto de aprendizaje como de generalizaci\'on, sin las mejoras al algor\'itmo
de aprendizaje.
La segunda parte consta de las mismas pruebas, con las mejoras implementadas.

\subsection{Pruebas sin mejoras al algor\'itmo de aprendizaje}

\subsubsection{Probando las redes}
Efectuamos 3 corridas de aprendizaje de la red para cada funci\'on de transferencia
los par\'ametros que fijamos para esta prueba son los siguientes:

    \begin{itemize}
       
	\item $\eta $ = 0.2
	\item tama\~no de ventana = 6
	\item Neuronas capa oculta = 10
    \end{itemize}
\begin{table}[h]
    \begin{center}
        \begin{tabular} {|l|l|l|l|l|l|l|}
	    \hline
		&\multicolumn{3}{|c|}{Exponencial}	& \multicolumn{3}{|c|}{ tangente hiperb} \\
	    \hline
	    Resultados & 1ra Corrida  & 2da Corrida & 3ra Corrida & 1ra Corrida & 2da Corrida &3ra Corrida \\
	    \hline
	    Cant unos total& 		771	&  771	&  771	& 771	& 771	&	771 \\ \hline
	    Cant unos aprendidos&  	741	&  740	&  739	& 738	& 737	&  	736\\ \hline
            \% unos correctos&  	96.10	&  95.97&  95.84& 95.71	& 95.59	&  	95.46\\ \hline
	    Tiempo total prueba [min]& 	30.74	&  29.01&  31.09& 15.16	& 15.19	&  	14.86\\ \hline
	    Cant \'epocas &  		200	&  200	&  200	& 100	& 100	&  	100\\ \hline
        \end{tabular}
        \caption{Aprendizaje - Probando las redes}
        \label{t:xor}
    \end{center}
\end{table}

% Generalizaci\'on:

\begin{table}[h]
    \begin{center}
        \begin{tabular} {|l|l|l|l|l|l|l|}
	\hline
	&\multicolumn{3}{|c|}{Exponencial}	& \multicolumn{3}{|c|}{ tangente hiperb} \\
	\hline
    	Resultados & 1ra Corrida  & 2da Corrida & 3ra Corrida & 1ra Corrida & 2da Corrida &3ra Corrida \\
        \hline
        \% Unos correctos  &  95.03  &  95.19  &  97.56  &  93.75  &  96.31  &  92.78  \\ \hline
        \% Ceros correctos &  98.73  &  98.62  &  97.57  &  98.21  &  97.67  &  98.37  \\ \hline
	\% Total correctos &  98.58  &  98.47  &  97.57  &  98.02  &  97.61  &  98.14  \\ \hline
        
	\end{tabular}
        \caption{Generalizaci\'on - Probando las redes}
        \label{t:xor}
    \end{center}
\end{table}



Se puede observar que tanto con la funci\'on de activaci\'on exponencial o la tangente hiperb\'olica,
los resultados obtenidos son muy similares en cuanto al porcentaje del aprendizaje de los 1 y ceros. 
Atrav'es de pruebas emp\'iricas, nos dimos cuenta de que para ambas funciones, se estancan despu\'es
de pasadas las 100 \'epocas, y debido a un \emph{rate learning} fijo, se queda oscilando sobre el m\'inimo 
del gradiente descendente. A las 3 pruebas realizadas con funci\'on de activaci\'on exponencial, dejamos 
que la corrida llegue a las 200 \'epocas, para ver si puede salir de su estancamiento, con resultados negativos.

\begin{figure}[h]
         \begin{center}
            \includegraphics[width=10cm]{prueba2_exp_5_sin_mejora.png}
	    \caption{Aprendizaje con 5 neuronas en la capa oculta}
         \end{center}
\end{figure}

\begin{figure}[h]
         \begin{center}
            \includegraphics[width=10cm]{prueba2_exp_5_gen_sin_mejora.png}
	    \caption{Generalizaci\'on con 5 neuronas en la capa oculta}
         \end{center}
\end{figure}

\subsubsection{Variando la cantidad de neuronas en la capa oculta}
Efectuamos distintas corridas incrementando la cantidad de neuronas
en la capa oculta usando como funci\'on de activaci\'on la funci\'on
exponencial.

\begin{itemize}
\item $\eta $ = 0.2
\item tama\~no de ventana = 6
\end{itemize}

\begin{table}[h]
    \begin{center}
        \begin{tabular} {|l|l|l|l|l|l|l|}
	    \hline
	    Cantidad de Neuronas
		 (c. oculta) 	&  5  	&  10	& 20	 & 50 	& 100 \\ \hline
	    Cant unos total	&  771	&  771	&  771	& 771	& 771 \\ \hline
	    Cant unos aprendidos&  738	&  740	&  736	& 735	& 736 \\ \hline
            \% unos correctos	&  95.71&  95.97&  95.46& 95.33	& 95.46	\\ \hline
	    Tiempo total prueba [min]& 	29.00	& 83.63 &  102.29  & 144.226  & 216.69  \\ \hline
	    Cant \'epocas 	&  200	&  200	&  200	& 200	& 200	\\ \hline
        \end{tabular}
        \caption{Aprendizaje - Variando la cantidad de neuronas en la capa oculta}
        \label{t:xor}
    \end{center}
\end{table}

% Generalizaci\'on:

\begin{table}[h]
    \begin{center}
        \begin{tabular} {|l|l|l|l|l|l|l|}
	\hline
	Cantidad de Neuronas
	 	(c. oculta)&  5      &  10     & 20	& 50 	  & 100 \\ \hline
        \% Unos correctos  &  93.26  &  95.19  & 95.51  &  91.98  &  93.42  \\ \hline
        \% Ceros correctos &  98.74  &  98.62  & 98.06  &  99.03  &  98.61  \\ \hline
	\% Total correctos &  98.58  &  98.47  & 98.02  &  97.61  &  98.14  \\ \hline
        
	\end{tabular}
        \caption{Generalizaci\'on - Variando la cantidad de neuronas en la capa oculta}
        \label{t:xor}
    \end{center}
\end{table}

Frente al incremento del n\'umero de neuronas y ante un \emph{learning rate} fijo, no 
hay diferencias en cuanto al resultado (s\'i se ver\'a cuando tengamos un 
\emph{learning rate} din\'amico implementado como una de las mejoras al algoritmo). 
Pero s\'i var\'ia en el tiempo del procesamiento ya 
que en cuanto m\'as neuronas haya en la capa oculta, m\'as c\'alculo, y por ende m\'as 
tarda el algoritmo.


\subsubsection{Variando el tama\~no de la ventana}
Efectuamos distintas corridas cambiando el tama\~no de la ventana con la que se captura 
las se\~nales. En otras palabras, se estamos variando la cantidad de entradas a la red.

\begin{itemize}  
\item $\eta $ = 0.2
\item Neuronas capa oculta = 10
\item Funci\'on de activaci\'on = exponencial
\end{itemize}

\begin{table}[h]
    \begin{center}
        \begin{tabular} {|l|l|l|l|l|l|l|}
	    \hline
	    Tama\~no ventana &  	3 	&  6 	&  10 	&  30   \\ \hline
	    Cant unos total& 		453	&  771	&  1195	&  3302 \\ \hline
	    Cant unos aprendidos&  	425	&  741	&  1160	&  3253	\\ \hline
            \% unos correctos&  	93.81	&  96.10&  97.07&  98.51\\ \hline
	    Tiempo total prueba [min]& 	29.09	&  30.74&  36.29&  66.3	\\ \hline
	    Cant \'epocas &  		200	&  200	&  200	&  200	\\ \hline
        \end{tabular}
        \caption{Aprendizaje - Variando el tama\~no de la ventana}
        \label{t:xor}
    \end{center}
\end{table}

% Generalizaci\'on:

\begin{table}[h]
    \begin{center}
        \begin{tabular} {|l|l|l|l|l|l|l|}
	\hline
	 Tama\~no ventana  &  	3 	&  6 	&  10 	&  30    \\ \hline
        \% Unos correctos  &  89.35  &  95.03  &  98.77 &  93.08 \\ \hline
        \% Ceros correctos &  99.22  &  98.73  &  96.76 &  96.64 \\ \hline
	\% Total correctos &  98.98  &  98.58  &  96.89 &  95.98 \\ \hline
        
	\end{tabular}
        \caption{Generalizaci\'on - Variando el tama\~no de la ventana}
        \label{t:xor}
    \end{center}
\end{table}

Incrementando el tama\~no de la ventana no modifica en cuanto a los resultados
de los porcentajes de aprendizaje, pero s\'i mejora el tiempo de procesamiento,
ya que el tiempo de c\'alculo de cada \'epoca tardar\'ia menos.



% CON MEJORAS ----------------------------------------------------
\subsection{Pruebas con mejoras al algor\'itmo de aprendizaje}
Se efectua las mismas corridas con los mismos par\'ametros de la secci\'on anterior
pero incorporando las mejoras descriptas anteriormente en el algoritmo.

\subsubsection{Probando las redes}

 \begin{itemize}     
\item $\eta $ inicial = 0.2
\item tama\~no de ventana = 6
\item Neuronas capa oculta = 10
\item alpha momentum = 0.9
\end{itemize}

\begin{table}[h]
    \begin{center}
        \begin{tabular} {|l|l|l|l|l|l|l|}
	\hline
	&\multicolumn{3}{|c|}{Exponencial}	& \multicolumn{3}{|c|}{ tangente hiperb} \\
	\hline
    	Resultados & 1ra Corrida  & 2da Corrida & 3ra Corrida & 1ra Corrida & 2da Corrida &3ra Corrida \\
        \hline
        Cant unos total  	&  771  &  771  &  771  &  771  &  771  &  771  \\ \hline
        Cant unos aprendidos 	&  746  &  742  &  740  &  771  &  743  &  744  \\ \hline
        \% unos correctos 	&  96.75&  96.28&  95.97 &  100  &  96.36&  96.49\\ \hline
        Tiempo total prueba 	&  50.46&  51.21&  22.97 &  41.61&  21.96&  8.37 \\ \hline
	Cant \'epocas 		&  290  &  300  &  130 &  244  &  128  &  47   \\ \hline
	$ \eta $ final 		&  0	&  0	&  0.000337 &  1.0e-4  & 0.00373  &  0.022588  \\ \hline
        \end{tabular}
        \caption{Aprendizaje con las mejoras - Probando las redes}
        \label{t:xor}
    \end{center}
\end{table}

\begin{table}[h]
    \begin{center}
        \begin{tabular} {|l|l|l|l|l|l|l|}
	\hline
	&\multicolumn{3}{|c|}{Exponencial}	& \multicolumn{3}{|c|}{ tangente hiperb} \\
	\hline
    	Resultados & 1ra Corrida  & 2da Corrida & 3ra Corrida & 1ra Corrida & 2da Corrida &3ra Corrida \\
        \hline
        \% Unos correctos  &  93.31  &  93.26  &  90.22  &  99.67  &  91.56  &  90.38  \\ \hline
        \% Ceros correctos &  96.81  &  96.73  &  97.27  &  93.77  &  96.64  &  96.98  \\ \hline
	\% Total correctos &  96.79  &  96.59  &  96.98  &  94.01  &  96.43  &  96.71  \\ \hline
        
	\end{tabular}
        \caption{Generalizaci\'on con las mejoras - Probando las redes}
        \label{t:xor}
    \end{center}
\end{table}

A diferencia de los resultados obtenidos con el algoritmo sin las mejoras implementadas, se puede
ver que el porcentaje de los 1 aprendidos se incrementaron levemente, pero lo importante es el algoritmo
ahora puede llegar a aprender el 100 \% de los 1. Esto se debe a que hayamos implementado un \emph{learning rate}
 din\'amico que permite hacer que el mismo sea m\'as chico cuando \'este se ecuentre cerca del m\'inimo, haciendo
que la correcci\'on de los pesos sea m\'as espec\'ifico y m\'as exacto. Otra diferencia con respecto
a los resultados obtenidos sin las mejoras es el tiempo de proceso con la que llega a un error deseado (en nuestro 
caso ser\'ia la cantidad de 1 deseados) o que se quede estancado en un m\'inimo local. Esto se debe al \emph{Momentun}
que permite al algoritmo optimizar en cuanto a la b\'usqueda de la soluci\'on.


\subsubsection{Variando la cantidad de neuronas en la capa oculta}
\begin{itemize}
\item $\eta $ = 0.2
\item tama\~no de ventana = 6
\end{itemize}

\begin{table}[h]
    \begin{center}
        \begin{tabular} {|l|l|l|l|l|l|l|}
	    \hline
	    Cantidad de Neuronas
		 (c. oculta) 	&  5  	&  10	& 20	 & 50 	& 100 \\ \hline
	    Cant unos total	&  771	&  771	&  771	& 771	& 771 \\ \hline
	    Cant unos aprendidos&  770	&  732	&  771	& 771	& 771 \\ \hline
            \% unos correctos	&  99.87&  96.75&  94.94& 100.00& 100.00\\ \hline
	    Tiempo total prueba [min]& 	133.38&  50.46   & 43.90    & 43.57 &  10.3  \\ \hline
	    Cant \'epocas 	&  300	&  290	&  181	& 114	& 14	\\ \hline
	    $ \eta $ final 	&  0	&  0	&  0.000026	&  0.000805  & 0.102668\\ \hline
        \end{tabular}
        \caption{Aprendizaje con las mejoras - Variando la cantidad de neuronas en la capa oculta}
        \label{t:xor}
    \end{center}
\end{table}

% Generalizaci\'on:

\begin{table}[h]
    \begin{center}
        \begin{tabular} {|l|l|l|l|l|l|l|}
	\hline
	Cantidad de Neuronas
	 	(c. oculta)&  5      &  10     & 20	& 50 	  & 100 \\ \hline
        \% Unos correctos  &  99.67  &  93.31 & 93.42  &  100.00 &  100.00 \\ \hline
        \% Ceros correctos &  93.22  &  96.81  & 95.67  &  89.42  &  0.00  \\ \hline
	\% Total correctos &  93.49  &  96.76  & 95.58  &  89.86  &  4.16   \\ \hline
        
	\end{tabular}
        \caption{Generalizaci\'on con las mejoras - Variando la cantidad de neuronas en la capa oculta}
        \label{t:xor}
    \end{center}
\end{table}

Incrementando la cantidad de neuronas en la capa oculta y con las mejoras implementadas al algoritmo, 
se puede observer una notable mejora en cuanto al aprendizaje de los 1 y 0 respecto de la versi\'on 
del algoritmo sin mejoras. Esto se debe a que el \emph{learning rate} le provee exactitud al algoritmo, y
el \emph{momentun} velocidad. Pero no todo es color de rosa,  ya que a medida que crece el n\'umero de 
neuronas en la capa oculta, la red se convierte en una red que memoriza eficientemente, pero pierde 
notablemnete la capacidad de generalizar. Se puede ver en el cuadro de la generalizaci\'on como 
con 100 neuronas no pudo generalizar ning\'un 0, de tener con 5 neuronas un porcentaje de generalizaci\'on
en un 93.49 \%, a tener con 100 neuronas un 4.16 \% .

\begin{figure}[h]
         \begin{center}
            \includegraphics[width=10cm]{prueba2_exp_5_con_mejora.png}
	    \caption{Aprendizaje con 5 neuronas en la capa oculta}
         \end{center}
\end{figure}

\begin{figure}[h]
         \begin{center}
            \includegraphics[width=10cm]{prueba2_exp_5_gen_con_mejora.png}
	    \caption{Generalizaci\'on con 5 neuronas en la capa oculta}
         \end{center}
\end{figure}


\subsubsection{Variando el tama\~no de la ventana}

\begin{itemize}  
\item $\eta $ = 0.2
\item Neuronas capa oculta = 10
\item Funci\'on de activaci\'on = exponencial
\end{itemize}

\begin{table}[h]
    \begin{center}
        \begin{tabular} {|l|l|l|l|l|l|l|}
	    \hline
	    Tama\~no ventana &  	3 	&  6 	&  10 	&  30   \\ \hline
	    Cant unos total& 		453	&  771	&  1195	&  3302 \\ \hline
	    Cant unos aprendidos&  	423	&  746	&  1195	&  3242	\\ \hline
            \% unos correctos&  	93.37	&  96.75&  100.00&  98.18\\ \hline
	    Tiempo total prueba [min]& 	14.63	&  50.46&  34.06&  72.52\\ \hline
	    Cant \'epocas &  		 92	&  290	&  166	&  200	\\ \hline
        \end{tabular}
        \caption{Aprendizaje con las mejoras - Variando el tama\~no de la ventana}
        \label{t:xor}
    \end{center}
\end{table}

% Generalizaci\'on:

\begin{table}[h]
    \begin{center}
        \begin{tabular} {|l|l|l|l|l|l|l|}
	\hline
	 Tama\~no ventana  &  	3 	&  6 	&  10 	&  30    \\ \hline
        \% Unos correctos  &  89.35  &  93.31  &  99.89 &  98.47 \\ \hline
        \% Ceros correctos &  98.90  &  96.81  &  48.26 &  29.94 \\ \hline
	\% Total correctos &  98.68  &  96.79  &  51.63 &  41.76 \\ \hline
        
	\end{tabular}
        \caption{Generalizaci\'on con las mejoras - Variando el tama\~no de la ventana}
        \label{t:xor}
    \end{center}
\end{table}

Con el incremento del tamao de la ventana con la que se lee las se\~nales, pasa algo muy parecido
a la subsecci\'on anterior, donde con un aumento de menor medida optimiza el rendimiento del
algor\'itmo en su velocidad de procesamiento (reflejado en la cantidad de \'epocas requeridas 
para llegar a a la soluci\'on) y en exactitud (reflejado en los resultados de la generalizaci\'on),
pero si crece demasiado, pierde notablemnete su capacidad de generalizaci\'on.


%dassssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss


\section{Conclusi\'on}
En una red neuronal, para que sea r\'apido, exacto y sin perder capacidad de generalizaci\'on, es 
fundamental tener presente la importancia del $\eta$, nuestro \emph{learning rate}. Tener un 
\emph{learning rate} que pueda acercar lo m\'as rapido a la soluci\'on posible al principio y 
despues poner \'enfasis en la exactid con la que nos acercamos. En cuanto a la arquitectura, 
tambi\'en es relevante buscar una que nos optimice el procesamiento, y encontrar la correcta,  
como una buena arquitectura le da un plus a la red entrenada, una mala, nos puede perjudicar 
mucho m\'as.\\
En nuestro problema en particular, La configuraci\'on con la cual la red aprendi\'o m\'as rapidamente, 
y tuvo una buena generalizaci\'on  fue con un $\eta $ inicial de 0.2, tama\~no de la ventana de patron = 6, 
una cantidad de neuronas en la capa oculta = 20, y con las mejoras en el algor\'itmo de aprendizaje activadas.


\clearpage
\appendix


%\section{generar.py}
%\lstset{stepnumber=1}
%\lstinputlisting[numbers=left,frame=bt,tabsize=4,showlines=true,language=python]{generar.py} 

\end{document}
